package com.main.controller;


import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.generico.dao.ctg.CtgCatalogoDao;
import com.generico.dao.ctg.CtgDepartamentoDao;
import com.generico.dao.ctg.CtgMunicipioDao;
import com.generico.dao.ctg.CtgSucursalDao;
import com.generico.dto.ctg.CtgSucursal;
import com.generico.exception.AsiWebException;
import com.generico.form.dto.RegistroCliente;
import com.main.cliente.dto.SgiPersona;
import com.main.dao.ClienteDAO;
import com.main.dao.RoleDAO;
import com.main.dao.SgiPersonaDao;
import com.main.dao.UserDAO;
import com.main.java.Cliente;
import com.main.java.CtgDepartamento;
import com.main.java.CtgMunicipio;
import com.main.java.User;
import com.main.java.UserRoles;
import com.web.util.GenericoUtil;

@Controller
@RequestMapping("/persona")
public class SgiPersonaController extends BaseController{

	@Autowired
	private SgiPersonaDao sgiPersonaDao;
	
	@Autowired
	private UserDAO userdao;
	
	@Autowired
	private CtgMunicipioDao ctgMunicipioDao;
	
	@Autowired
	private CtgDepartamentoDao ctgDepartamentoDao;
	
	@Autowired
	private RoleDAO roleDAO;
	
	@Autowired
	private CtgCatalogoDao ctgCatalogoDao;
	
	@Autowired
	private ClienteDAO clienteDAO;
	
	@Autowired
	private CtgSucursalDao ctgSucursalDao;
	
	@Autowired
	private UserDAO userRepository;
	
//	@RequestMapping(value = "/crearCliente", method=RequestMethod.POST)
//	public String crearCliente(@ModelAttribute("sgiPersona") SgiPersona sgiPersona, BindingResult result) {
//		try {
//			GenericoUtil genericoUtil = new GenericoUtil();
//					genericoUtil.getCtgSucursalIdFromAcegi();
//			sgiPersonaDao.savePersona(sgiPersona);
//		} catch (AsiWebException e) {
//			e.printStackTrace();
//		}
//		return "redirect:clienteHome";
//	}
	
	
	@RequestMapping(value = "/crearCliente", method=RequestMethod.POST)
	public String crearCliente(@ModelAttribute("sgiPersona") RegistroCliente registroCliente, BindingResult result) throws AsiWebException{
	
		try {
			
			Long num = Long.parseLong(userRepository.contarUsuarios(registroCliente.getLogin()).toString());
			if (num == 1) {
				Random rnd = new Random();
				logger.info("contar Usrer:: " + num);
				throw new AsiWebException(registroCliente.getLogin() + " ya existe intente " + registroCliente.getLogin() + (int)(rnd.nextDouble() * 20 + 1));
			} else {
				User usuario = new User();
				UserRoles userRoles = new UserRoles();
				CtgMunicipio ctgMunicipio = new CtgMunicipio();
				CtgDepartamento ctgDepartamento = new CtgDepartamento();
				CtgSucursal ctgSucursal = new CtgSucursal();
				
				
				ctgMunicipio = ctgMunicipioDao.obtenerMunicipioPorId(Long.parseLong(registroCliente.getCtgMunicipio()));
				ctgDepartamento = ctgDepartamentoDao.obtenerCtgDepartamentoPorId(ctgMunicipio.getCtgDepartamento().getCatalogoDepartamentoId());
				ctgSucursal= ctgSucursalDao.encontrarctgSucursalPorId(Long.parseLong(registroCliente.getCtgSucursal()));
				
				usuario.setLogin(registroCliente.getLogin());
				usuario.setPassword(GenericoUtil.getBase64Encode(registroCliente.getPassword()));
				usuario.setUsuarioCambiarClave(true);
				usuario.setUsuarioActivo("1");
				usuario.setCtgSucursal(ctgSucursal);
				userdao.saveUsuario(usuario);
				
				userRoles.setUsers(usuario);
				userRoles.setRoles(roleDAO.findByCodigo(GenericoUtil.ROL_CLIENTE));
				userdao.saveUsuario(userRoles);
				
				SgiPersona sgiPersona = new SgiPersona();
				sgiPersona.setPersonaPrimerNombre(registroCliente.getPersonaPrimerNombre());
				sgiPersona.setPersonaSegundoNombre(registroCliente.getPersonaSegundoNombre());
				sgiPersona.setPersonaPrimerApellido(registroCliente.getPersonaPrimerApellido());
				sgiPersona.setPersonaSegundoApellido(registroCliente.getPersonaSegundoApellido());
				sgiPersona.setPersonaDireccion(registroCliente.getPersonaDireccion());
				sgiPersona.setPersonaEmail(registroCliente.getPersonaEmail());
				sgiPersona.setUser(usuario);
				sgiPersona.setCtgmunicipio(ctgMunicipio);
				sgiPersona.setCtgDepartamento(ctgDepartamento);
				sgiPersonaDao.savePersona(sgiPersona);
				
				Cliente cliente = new Cliente();
				cliente.setClienteNumeroDeCuenta("00000000");
				cliente.setCtgCatalogo(ctgCatalogoDao.findByCtgCatalogoId(GenericoUtil.CTG_PERSONA_NATURAL));
				cliente.setSgiPersona(sgiPersona);
				
				clienteDAO.guardarCliente(cliente);
				
				return "redirect:/user-login";
			}
			
			
			
			
			
					
		}catch(BadCredentialsException e){
			e.printStackTrace();
			throw e;
		}catch(Exception e){
			throw new DataIntegrityViolationException("Problemas al autenticar al usuario: " + e.getMessage(), e);
		}
	}
	
}
	
	
	
	
	
	

